package com.ghw.neteasemusic.common.result;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 统一响应结构
 *
 * @author violet
 * @since 2021/11/27 23:54
 */
@Data
@Accessors(chain = true)
public class R<T> implements Serializable {

    private static final long serialVersionUID = 7270042499607840511L;

    /**
     * 响应状态码
     */
    private int code;
    /**
     * 响应消息
     */
    private String msg;
    /**
     * 响应数据
     */
    private T result;

    /**
     * 构造器
     *
     * @param resultCode 传入ResultCode，自动设置code和msg
     */
    public R(ResultCode resultCode) {
        this.code = resultCode.getCode();
        this.msg = resultCode.getMsg();
    }

    /**
     * 成功，但不返回数据
     */
    public static <T> R<T> success() {
        return new R<>(ResultCode.SUCCESS);
    }

    /**
     * 成功并返回数据
     */
    public static <T> R<T> success(T data) {
        return new R<T>(ResultCode.SUCCESS).setResult(data);
    }

    /**
     * 失败，默认的错误信息
     */
    public static <T> R<T> fail() {
        return new R<>(ResultCode.FAIL);
    }

    /**
     * 失败，自定义错误信息
     *
     * @param msg 错误消息
     */
    public static <T> R<T> fail(String msg) {
        return new R<T>(ResultCode.FAIL).setMsg(msg);
    }

    /**
     * 条件为true则返回成功，否则返回失败
     *
     * @param status 条件
     */
    public static <T> R<T> status(boolean status) {
        return status ? new R<>(ResultCode.SUCCESS) : new R<>(ResultCode.FAIL);
    }

    /**
     * 如果错误消息为空或为null，则返回成功，否则返回失败
     *
     * @param errMsg 错误消息
     */
    public static <T> R<T> status(String errMsg) {
        return StrUtil.isBlank(errMsg) ? new R<>(ResultCode.SUCCESS) : new R<T>(ResultCode.FAIL).setMsg(errMsg);
    }

}
